package kommunikation.Parser;

public class TelefonParser extends TuringMaschine
{
  
  /*
   * Diese Methode Initialisiert die Turingmaschine Es wird eine Menge
   * gebrauchter Zustaende erzeugt. Jedem Zustnd wird keine oder mehrere
   * Konfigurationen zugewiesen. Es Wird ein neues Alphabet erzeugt (ein
   * String mit allen gueltigen Zeichen. Es wird ein neues Band erezugt
   * dem das Alphabet und das zu pruefende Wort uebergeben.
   */
  public void initialisieren (String eingabewort)
  {
    String alphabet = "*0123456789+- ";

    zustaende = new Zustand[32];
    for (int i = 0; i < zustaende.length; i++)
    {
      zustaende[i] = new Zustand (i);
    }
    /* Zusatnd 0 */
    zustaende[0].konfigHinzufuegen ('0','0', Konfig.R, zustaende[1]);
    for (int i = 2; i < alphabet.length () -3; i++)
    {
      zustaende[0].konfigHinzufuegen (alphabet.charAt (i),
	  alphabet.charAt (i), Konfig.N, zustaende[24]);
    }
    zustaende[0].konfigHinzufuegen ('*','*', Konfig.N, zustaende[24]);
    zustaende[0].konfigHinzufuegen ('-','-', Konfig.N, zustaende[24]);
    zustaende[0].konfigHinzufuegen ('+','+', Konfig.R, zustaende[1]);
    zustaende[0].konfigHinzufuegen (' ', ' ', Konfig.N, zustaende[24]);
    /* Zustand 1 */
    for (int i = 1; i < alphabet.length () -3; i++)
    {
      zustaende[1].konfigHinzufuegen (alphabet.charAt (i),
	  alphabet.charAt (i), Konfig.R, zustaende[2]);
    }
    zustaende[1].konfigHinzufuegen ('*', '*', Konfig.N, zustaende[24]);
    zustaende[1].konfigHinzufuegen ('-','-', Konfig.N, zustaende[24]);
    zustaende[1].konfigHinzufuegen ('+','+', Konfig.N, zustaende[24]);
    zustaende[1].konfigHinzufuegen (' ', ' ', Konfig.N, zustaende[24]);
    /* Zustand 2 */
    for (int i = 1; i < alphabet.length () -3 ; i++)
    {
      zustaende[2].konfigHinzufuegen (alphabet.charAt (i),
	  alphabet.charAt (i), Konfig.R, zustaende[3]);
    }
    zustaende[2].konfigHinzufuegen ('*', '*', Konfig.N, zustaende[24]);
    zustaende[2].konfigHinzufuegen ('-','-', Konfig.R, zustaende[7]);
    zustaende[2].konfigHinzufuegen ('+','+', Konfig.N, zustaende[24]);
    zustaende[2].konfigHinzufuegen (' ', ' ', Konfig.R, zustaende[7]);
    /* Zustand 3 */
    for (int i = 1; i < alphabet.length () -3; i++)
    {
      zustaende[3].konfigHinzufuegen (alphabet.charAt (i),
	  alphabet.charAt (i), Konfig.R, zustaende[4]);
    }
    zustaende[3].konfigHinzufuegen ('*', '*', Konfig.N, zustaende[24]);
    zustaende[3].konfigHinzufuegen ('-','-', Konfig.R, zustaende[7]);
    zustaende[3].konfigHinzufuegen ('+','+', Konfig.N, zustaende[24]);
    zustaende[3].konfigHinzufuegen (' ', ' ', Konfig.R, zustaende[7]);
    /* Zustand 4 */
    for (int i = 0; i < alphabet.length ()-3; i++)
    {
      zustaende[4].konfigHinzufuegen (alphabet.charAt (i),
	  alphabet.charAt (i), Konfig.N, zustaende[5]);
    }
    zustaende[4].konfigHinzufuegen ('*', '*', Konfig.N, zustaende[24]);
    zustaende[4].konfigHinzufuegen ('-', '-', Konfig.R, zustaende[7]);
    zustaende[4].konfigHinzufuegen ('+','+', Konfig.N, zustaende[24]);
    zustaende[4].konfigHinzufuegen (' ', ' ', Konfig.R, zustaende[7]);
    /* Zustand 5 */
    for (int i = 1; i < alphabet.length ()-3; i++)
    {
      zustaende[5].konfigHinzufuegen (alphabet.charAt (i),
	  alphabet.charAt (i), Konfig.R, zustaende[6]);
    }
    zustaende[5].konfigHinzufuegen ('*', '*', Konfig.N, zustaende[24]);
    zustaende[5].konfigHinzufuegen ('-', '-', Konfig.R, zustaende[7]);
    zustaende[5].konfigHinzufuegen ('+','+', Konfig.N, zustaende[24]);
    zustaende[5].konfigHinzufuegen (' ', ' ', Konfig.R, zustaende[7]);
    /* Zustand 6 */
    for (int i = 1; i < alphabet.length () -3; i++)
    {
      zustaende[6].konfigHinzufuegen (alphabet.charAt (i),
	  alphabet.charAt (i), Konfig.N, zustaende[24]);
    }
    zustaende[6].konfigHinzufuegen ('*', '*', Konfig.N, zustaende[24]);
    zustaende[6].konfigHinzufuegen ('-', '-', Konfig.R, zustaende[7]);
    zustaende[6].konfigHinzufuegen ('+','+', Konfig.N, zustaende[24]);
    zustaende[6].konfigHinzufuegen (' ', ' ', Konfig.R, zustaende[7]);
    /* Zustand 7 */
    for (int i = 2; i < alphabet.length () ; i++)
    {
      zustaende[7].konfigHinzufuegen (alphabet.charAt (i),
	  alphabet.charAt (i), Konfig.N, zustaende[24]);
    }
    zustaende[7].konfigHinzufuegen ('*', '*', Konfig.N, zustaende[24]);
    zustaende[7].konfigHinzufuegen ('0', '0', Konfig.R, zustaende[8]);
    /* Zustand 8 */ 
    for (int i = 1; i < alphabet.length () -3; i++)
    {
      zustaende[8].konfigHinzufuegen (alphabet.charAt (i),
	  alphabet.charAt (i), Konfig.R, zustaende[9]);
    }
    zustaende[8].konfigHinzufuegen ('*', '*', Konfig.N, zustaende[24]);
    zustaende[8].konfigHinzufuegen ('-', '-', Konfig.N, zustaende[24]);
    zustaende[8].konfigHinzufuegen ('+', '+', Konfig.N, zustaende[24]);
    zustaende[8].konfigHinzufuegen (' ', ' ', Konfig.N, zustaende[24]);
    /* Zustand 9 */
    for (int i = 1; i < alphabet.length () -3; i++)
    {
      zustaende[9].konfigHinzufuegen (alphabet.charAt (i),
	  alphabet.charAt (i), Konfig.R, zustaende[10]);
    }
    zustaende[9].konfigHinzufuegen ('*', '*', Konfig.N, zustaende[24]);
    zustaende[9].konfigHinzufuegen ('-', '-', Konfig.N, zustaende[24]);
    zustaende[9].konfigHinzufuegen ('+', '+', Konfig.N, zustaende[24]);
    zustaende[9].konfigHinzufuegen (' ', ' ', Konfig.N, zustaende[24]);
    /* Zustand 10 */
    for (int i = 1; i < alphabet.length () -3; i++)
    {
      zustaende[10].konfigHinzufuegen (alphabet.charAt (i),
	  alphabet.charAt (i), Konfig.R, zustaende[11]);
    }
    zustaende[10].konfigHinzufuegen ('*', '*', Konfig.N, zustaende[24]);
    zustaende[10].konfigHinzufuegen ('-', '-', Konfig.N, zustaende[24]);
    zustaende[10].konfigHinzufuegen ('+', '+', Konfig.N, zustaende[24]);
    zustaende[10].konfigHinzufuegen (' ', ' ', Konfig.N, zustaende[24]);
    /* Zustand 11 */
    for (int i = 1; i < alphabet.length () -3; i++)
    {
      zustaende[11].konfigHinzufuegen (alphabet.charAt (i),
	  alphabet.charAt (i), Konfig.R, zustaende[12]);
    }
    zustaende[11].konfigHinzufuegen ('*', '*', Konfig.N, zustaende[24]);
    zustaende[11].konfigHinzufuegen ('-', '-', Konfig.R, zustaende[13]);
    zustaende[11].konfigHinzufuegen ('+', '+', Konfig.N, zustaende[24]);
    zustaende[11].konfigHinzufuegen (' ', ' ', Konfig.R, zustaende[13]);
    /* Zustand 12 */
    for (int i = 1; i < alphabet.length () -3; i++)
    {
      zustaende[12].konfigHinzufuegen (alphabet.charAt (i),
	  alphabet.charAt (i), Konfig.N, zustaende[24]);
    }
    zustaende[12].konfigHinzufuegen ('*', '*', Konfig.N, zustaende[24]);
    zustaende[12].konfigHinzufuegen ('-', '-', Konfig.R, zustaende[13]);
    zustaende[12].konfigHinzufuegen ('+', '+', Konfig.N, zustaende[24]);
    zustaende[12].konfigHinzufuegen (' ', ' ', Konfig.R, zustaende[13]);
    /* Zustand 13 */
    for (int i = 1; i < alphabet.length () -3; i++)
    {
      zustaende[13].konfigHinzufuegen (alphabet.charAt (i),
	  alphabet.charAt (i), Konfig.R, zustaende[14]);
    }
    zustaende[13].konfigHinzufuegen ('*', '*', Konfig.N, zustaende[24]);
    zustaende[13].konfigHinzufuegen ('-', '-', Konfig.N, zustaende[24]);
    zustaende[13].konfigHinzufuegen ('+', '+', Konfig.N, zustaende[24]);
    zustaende[13].konfigHinzufuegen (' ', ' ', Konfig.N, zustaende[24]);
    /* Zustand 14 */
    for (int i = 1; i < alphabet.length () -3; i++)
    {
      zustaende[14].konfigHinzufuegen (alphabet.charAt (i),
	  alphabet.charAt (i), Konfig.R, zustaende[15]);
    }
    zustaende[14].konfigHinzufuegen ('*', '*', Konfig.N, zustaende[24]);
    zustaende[14].konfigHinzufuegen ('-', '-', Konfig.N, zustaende[24]);
    zustaende[14].konfigHinzufuegen ('+', '+', Konfig.N, zustaende[24]);
    zustaende[14].konfigHinzufuegen (' ', ' ', Konfig.N, zustaende[24]);
    /* Zustand 15 */
    for (int i = 1; i < alphabet.length () -3; i++)
    {
      zustaende[15].konfigHinzufuegen (alphabet.charAt (i),
	  alphabet.charAt (i), Konfig.R, zustaende[16]);
    }
    zustaende[15].konfigHinzufuegen ('*', '*', Konfig.N, zustaende[24]);
    zustaende[15].konfigHinzufuegen ('-', '-', Konfig.N, zustaende[24]);
    zustaende[15].konfigHinzufuegen ('+', '+', Konfig.N, zustaende[24]);
    zustaende[15].konfigHinzufuegen (' ', ' ', Konfig.N, zustaende[24]);
    /* Zustand 16 */
    for (int i = 1; i < alphabet.length () -3; i++)
    {
      zustaende[16].konfigHinzufuegen (alphabet.charAt (i),
	  alphabet.charAt (i), Konfig.R, zustaende[17]);
    }
    zustaende[16].konfigHinzufuegen ('*', '*', Konfig.N, zustaende[24]);
    zustaende[16].konfigHinzufuegen ('-', '-', Konfig.N, zustaende[24]);
    zustaende[16].konfigHinzufuegen ('+', '+', Konfig.N, zustaende[24]);
    zustaende[16].konfigHinzufuegen (' ', ' ', Konfig.N, zustaende[24]);
    /* Zustand 17 */
    for (int i = 1; i < alphabet.length () -3; i++)
    {
      zustaende[17].konfigHinzufuegen (alphabet.charAt (i),
	  alphabet.charAt (i), Konfig.R, zustaende[18]);
    }
    zustaende[17].konfigHinzufuegen ('*', '*', Konfig.N, zustaende[24]);
    zustaende[17].konfigHinzufuegen ('-', '-', Konfig.N, zustaende[24]);
    zustaende[17].konfigHinzufuegen ('+', '+', Konfig.N, zustaende[24]);
    zustaende[17].konfigHinzufuegen (' ', ' ', Konfig.N, zustaende[24]);
    /* Zustand 18 */
    for (int i = 1; i < alphabet.length () -3; i++)
    {
      zustaende[18].konfigHinzufuegen (alphabet.charAt (i),
	  alphabet.charAt (i), Konfig.R, zustaende[19]);
    }
    zustaende[18].konfigHinzufuegen ('*', '*', Konfig.N, zustaende[23]);
    zustaende[18].konfigHinzufuegen ('-', '-', Konfig.N, zustaende[24]);
    zustaende[18].konfigHinzufuegen ('+', '+', Konfig.N, zustaende[24]);
    zustaende[18].konfigHinzufuegen (' ', ' ', Konfig.R, zustaende[23]);
    /* Zustand 19 */
    for (int i = 1; i < alphabet.length () -3; i++)
    {
      zustaende[19].konfigHinzufuegen (alphabet.charAt (i),
	  alphabet.charAt (i), Konfig.R, zustaende[20]);
    }
    zustaende[19].konfigHinzufuegen ('*', '*', Konfig.N, zustaende[23]);
    zustaende[19].konfigHinzufuegen ('-', '-', Konfig.N, zustaende[24]);
    zustaende[19].konfigHinzufuegen ('+', '+', Konfig.N, zustaende[24]);
    zustaende[19].konfigHinzufuegen (' ', ' ', Konfig.R, zustaende[23]);
    /* Zustand 20 */
    for (int i = 1; i < alphabet.length () -3; i++)
    {
      zustaende[20].konfigHinzufuegen (alphabet.charAt (i),
	  alphabet.charAt (i), Konfig.R, zustaende[21]);
    }
    zustaende[20].konfigHinzufuegen ('*', '*', Konfig.N, zustaende[23]);
    zustaende[20].konfigHinzufuegen ('-', '-', Konfig.N, zustaende[24]);
    zustaende[20].konfigHinzufuegen ('+', '+', Konfig.N, zustaende[24]);
    zustaende[20].konfigHinzufuegen (' ', ' ', Konfig.R, zustaende[23]);
    /* Zustand 21 */
    for (int i = 1; i < alphabet.length () -3; i++)
    {
      zustaende[21].konfigHinzufuegen (alphabet.charAt (i),
	  alphabet.charAt (i), Konfig.R, zustaende[22]);
    }
    zustaende[21].konfigHinzufuegen ('*', '*', Konfig.N, zustaende[23]);
    zustaende[21].konfigHinzufuegen ('-', '-', Konfig.N, zustaende[24]);
    zustaende[21].konfigHinzufuegen ('+', '+', Konfig.N, zustaende[24]);
    zustaende[21].konfigHinzufuegen (' ', ' ', Konfig.R, zustaende[23]);
    /* Zustand 22 */
    for (int i = 1; i < alphabet.length () -3; i++)
    {
      zustaende[22].konfigHinzufuegen (alphabet.charAt (i),
	  alphabet.charAt (i), Konfig.R, zustaende[24]);
    }
    zustaende[22].konfigHinzufuegen ('*', '*', Konfig.N, zustaende[23]);
    zustaende[22].konfigHinzufuegen ('-', '-', Konfig.N, zustaende[24]);
    zustaende[22].konfigHinzufuegen ('+', '+', Konfig.N, zustaende[24]);
    zustaende[22].konfigHinzufuegen (' ', ' ', Konfig.R, zustaende[23]);
    /* Zustand 23 ist Endzustand */
    /* Zustand 24 ist Fehlerzustand */
    /* Zustand 25 ist Startzustand*/
    for (int i = 1; i < alphabet.length () -2; i++)
    {
      zustaende[25].konfigHinzufuegen (alphabet.charAt (i),
	  alphabet.charAt (i), Konfig.R, zustaende[26]);
    }
    zustaende[25].konfigHinzufuegen ('*', '*', Konfig.R, zustaende[25]);
    zustaende[25].konfigHinzufuegen ('-', '-', Konfig.N, zustaende[24]);
    zustaende[25].konfigHinzufuegen (' ', ' ', Konfig.N, zustaende[24]);
    /* Zustand 26 */ 
    for (int i = 1; i < alphabet.length () -3; i++)
    {
      zustaende[26].konfigHinzufuegen (alphabet.charAt (i),
	  alphabet.charAt (i), Konfig.R, zustaende[26]);
    }
    zustaende[26].konfigHinzufuegen ('*', '*', Konfig.L, zustaende[29]);
    zustaende[26].konfigHinzufuegen ('-', '-', Konfig.R, zustaende[27]);
    zustaende[26].konfigHinzufuegen ('+', '+', Konfig.N, zustaende[24]);
    zustaende[26].konfigHinzufuegen (' ', ' ', Konfig.R, zustaende[27]);
    /* Zustand 27 */
    for (int i = 1; i < alphabet.length () -3; i++)
    {
      zustaende[27].konfigHinzufuegen (alphabet.charAt (i),
	  alphabet.charAt (i), Konfig.R, zustaende[27]);
    }
    zustaende[27].konfigHinzufuegen ('*', '*', Konfig.L, zustaende[30]);
    zustaende[27].konfigHinzufuegen ('-', '-', Konfig.R, zustaende[28]);
    zustaende[27].konfigHinzufuegen ('+', '+', Konfig.N, zustaende[24]);
    zustaende[27].konfigHinzufuegen (' ', ' ', Konfig.R, zustaende[28]);
    /* Zustand 28 */
    for (int i = 1; i < alphabet.length () -3; i++)
    {
      zustaende[28].konfigHinzufuegen (alphabet.charAt (i),
	  alphabet.charAt (i), Konfig.R, zustaende[28]);
    }
    zustaende[28].konfigHinzufuegen ('*', '*', Konfig.L, zustaende[31]);
    zustaende[28].konfigHinzufuegen ('-', '-', Konfig.N, zustaende[24]);
    zustaende[28].konfigHinzufuegen ('+', '+', Konfig.N, zustaende[24]);
    zustaende[28].konfigHinzufuegen (' ', ' ', Konfig.N, zustaende[24]);
    /* Zustand 29 */
    for (int i = 1; i < alphabet.length () -2; i++)
    {
      zustaende[29].konfigHinzufuegen (alphabet.charAt (i),
	  alphabet.charAt (i), Konfig.L, zustaende[29]);
    }
    zustaende[29].konfigHinzufuegen ('*', '*', Konfig.R, zustaende[13]);
    zustaende[29].konfigHinzufuegen ('-', '-', Konfig.L, zustaende[29]);
    zustaende[29].konfigHinzufuegen (' ', ' ', Konfig.L, zustaende[29]);
    /* Zustand 30 */
    for (int i = 1; i < alphabet.length () -2; i++)
    {
      zustaende[30].konfigHinzufuegen (alphabet.charAt (i),
	  alphabet.charAt (i), Konfig.L, zustaende[30]);
    }
    zustaende[30].konfigHinzufuegen ('*', '*', Konfig.R, zustaende[7]);
    zustaende[30].konfigHinzufuegen ('-', '-', Konfig.L, zustaende[30]);
    zustaende[30].konfigHinzufuegen (' ', ' ', Konfig.L, zustaende[30]);
    /* Zustand 31 */
    for (int i = 1; i < alphabet.length () -2; i++)
    {
      zustaende[31].konfigHinzufuegen (alphabet.charAt (i),
	  alphabet.charAt (i), Konfig.L, zustaende[31]);
    }
    zustaende[31].konfigHinzufuegen ('*', '*', Konfig.R, zustaende[0]);
    zustaende[31].konfigHinzufuegen ('-', '-', Konfig.L, zustaende[31]);
    zustaende[31].konfigHinzufuegen (' ', ' ', Konfig.L, zustaende[31]);
    
    Alphabet a = new Alphabet (alphabet);
    band = new Band (a, "*" + eingabewort);
    aktuellerZustand = zustaende[25];
    fehlerZustand = zustaende[24];
  }
  /*
   * Die Main-Methode bringt das Programm zum laufen
   */
  public static void main (String [] args)
  {
    TelefonParser plzp = new TelefonParser ();
    plzp.initialisieren ("+49 0661 21393");
    System.out.println(plzp.band.getBand ());
    while (!plzp.getAktuellenZusatnd ().istEndzustand ()
        && !plzp.istImFehlerzustand ())
    {
      plzp.arbeiten ();
      System.out.println(plzp.band.getBand ());
      System.out.println(plzp.band.getAktuellesZeichen ());
      
    }
    if (plzp.istImFehlerzustand ())
    {
      System.out.println ("ungueltige Telefonnummer");
    }
    else
    {
      System.out.println ("Telefonnumer ist gueltig");
    }
  }
}
